package servlet;

import anno.Autowired;
import anno.RequestBody;
import anno.ResponseBody;
import dao.CourseDAO;
import pojo.Course;
import utils.ApiResult;
import utils.JDBCUtils;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.SQLException;
import java.util.List;

@WebServlet("/course")
public class CourseServlet extends BaseServlet {

    @Autowired
    private CourseDAO courseDAO;

    /**
     * 根据教师ID查询自己所有课程
     *
     * @param req  请求对象
     * @param resp 响应对象
     * @param teacherId 教师ID
     * @return ApiResult 结果对象
     * @throws SQLException 数据库异常
     */
    @ResponseBody
    public ApiResult getAllCoursesByTeacherId(HttpServletRequest req, HttpServletResponse resp, String teacherId) throws SQLException {
        List<Course> courses = courseDAO.findByTeacherId(Integer.parseInt(teacherId));
        return new ApiResult(200, "查询教师所有课程成功", courses);
    }

    /**
     * 根据学生ID查询该学生有哪些课程
     *
     * @param req  请求对象
     * @param resp 响应对象
     * @param studentId 学生ID
     * @return ApiResult 结果对象
     * @throws SQLException 数据库异常
     */
    @ResponseBody
    public ApiResult getCoursesByStudentId(HttpServletRequest req, HttpServletResponse resp, String studentId) throws SQLException {
        List<Course> courses = courseDAO.findCoursesByStudentId(Integer.parseInt(studentId));
        return new ApiResult(200, "查询学生课程成功", courses);
    }
    /**
     * 添加课程
     *
     * @param req  请求对象
     * @param resp 响应对象
     * @param course 课程对象
     * @return ApiResult 结果对象
     * @throws SQLException 数据库异常
     */
    @ResponseBody
    public ApiResult addCourse(HttpServletRequest req, HttpServletResponse resp, @RequestBody Course course) throws SQLException {
        courseDAO.insert(course);
        return new ApiResult(200, "课程添加成功", null);
    }

    /**
     * 更新课程
     *
     * @param req  请求对象
     * @param resp 响应对象
     * @param course 课程对象
     * @return ApiResult 结果对象
     * @throws SQLException 数据库异常
     */
    @ResponseBody
    public ApiResult updateCourse(HttpServletRequest req, HttpServletResponse resp, @RequestBody Course course) throws SQLException {
        courseDAO.update(course);
        return new ApiResult(200, "课程更新成功", null);
    }

    /**
     * 删除课程
     *
     * @param req  请求对象
     * @param resp 响应对象
     * @param id 课程ID
     * @return ApiResult 结果对象
     * @throws SQLException 数据库异常
     */
    @ResponseBody
    public ApiResult deleteCourse(HttpServletRequest req, HttpServletResponse resp, String id) throws SQLException {
        courseDAO.deleteById(Integer.parseInt(id));
        return new ApiResult(200, "课程删除成功", null);
    }

    /**
     * 根据ID查询课程
     *
     * @param req  请求对象
     * @param resp 响应对象
     * @param id 课程ID
     * @return ApiResult 结果对象
     * @throws SQLException 数据库异常
     */
    @ResponseBody
    public ApiResult getCourseById(HttpServletRequest req, HttpServletResponse resp, String id) throws SQLException {
        Course course = courseDAO.findById(Integer.parseInt(id));
        return new ApiResult(200, "课程查询成功", course);
    }

    /**
     * 分页查询课程列表（管理员权限）
     *
     * @param req  请求对象
     * @param resp 响应对象
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return ApiResult 结果对象
     * @throws SQLException 数据库异常
     */
    @ResponseBody
    public ApiResult getCoursesByPage(HttpServletRequest req, HttpServletResponse resp, String pageNum, String pageSize) throws SQLException {
        JDBCUtils.Page<Course> page = courseDAO.findCoursesByPage(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
        return new ApiResult(200, "分页查询课程成功", page);
    }

    /**
     * 分页模糊查询课程列表（管理员和教师权限）
     *
     * @param req  请求对象
     * @param resp 响应对象
     * @param teacherId 教师ID（可选）
     * @param keyword 关键词
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @return ApiResult 结果对象
     * @throws SQLException 数据库异常
     */
    @ResponseBody
    public ApiResult getCoursesByPageAndName(HttpServletRequest req, HttpServletResponse resp, String teacherId, String keyword, String pageNum, String pageSize) throws SQLException {
        Integer teacherIdInt = teacherId != null && !teacherId.isEmpty() ? Integer.parseInt(teacherId) : null;
        JDBCUtils.Page<Course> page = courseDAO.findCoursesByPageAndName(teacherIdInt, keyword, Integer.parseInt(pageNum), Integer.parseInt(pageSize));
        return new ApiResult(200, "分页模糊查询课程成功", page);
    }
}